@gorgo/medusa-feed-yandex
Version:
A Medusa plugin that generates a product feed in YML (Yandex Market Language) format
57 lines (45 loc) • 1.82 kB
text/typescript
import type { MedusaRequest, MedusaResponse } from "@medusajs/framework"
import { ContainerRegistrationKeys, Modules } from "@medusajs/framework/utils"
import { gunzip } from "zlib"
import { promisify } from "util"
const FILE_EXTENSION = ".xml"
export const GET = async (req: MedusaRequest, res: MedusaResponse) => {
try {
const { id, fileName } = req.params
const query = req.scope.resolve(ContainerRegistrationKeys.QUERY)
const fileModuleService = req.scope.resolve(Modules.FILE)
const { data } = await query.graph({
entity: "feed",
filters: { id },
fields: ["file_path", "file_name"],
})
const feed = data?.[0]
if (!feed) {
return res.status(404).json({ message: "Feed not found" })
}
const { file_path: filePath, file_name: expectedFileName } = feed
if (!filePath || !expectedFileName) {
return res.status(404).json({ message: "Feed file info missing" })
}
const expectedFileNameWithExt = expectedFileName + FILE_EXTENSION
if (expectedFileNameWithExt !== fileName) {
return res.status(404).json({ message: "File name does not match" })
}
let fileId: string
try {
const url = new URL(filePath)
fileId = url.pathname.split("/").pop()!
} catch {
return res.status(400).json({ message: "Invalid file path format" })
}
const encoded = decodeURIComponent(fileId)
const base64Buffer = await fileModuleService.getAsBuffer(encoded)
const gunzipAsync = promisify(gunzip)
const xmlBuffer = await gunzipAsync(base64Buffer)
res.setHeader("Content-Type", "application/xml")
res.setHeader("Content-Disposition", `inline; filename="${fileName}"`)
res.send(xmlBuffer)
} catch (err) {
return res.status(500).json({ message: "Internal server error" })
}
}